﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MazeModel
{
    public class MazeObject
    {
        public int[] pos = new int[2];          // staða í fylkinu ( [i,j] )
        internal int[] subpos = new int[2];     // staða í node (offset)

        public MazeObject(int i, int j)
        {
            pos[0] = i;
            pos[1] = j;
        }
        public MazeObject()
        {
            pos[0] = 0;
            pos[1] = 0;
        }

        public int[] getPos()
        {
            return pos;
        }
        public int[] getSubPos()
        {
            return subpos;
        }

        // Færir þennan hlut í áttina dir
        // oppositeCell er sellan sem hluturinn gæti rekist á ef hann er kominn að honum
        public void move(int oppositeCell, int dir)
        {
            // hætti ef hlutur er að rekast á vegg
            if ((oppositeCell == 1) && (subpos[0] == 0) && (dir == 1 || dir == 2))
            {
                return;
            }
            if ((oppositeCell == 1) && (subpos[1] == 0) && (dir == 3 || dir == 4))
            {
                return;
            }

            // Uppfæri subpos
            switch (dir)
            {
                case 1:
                    this.subpos[0]--;
                    this.subpos[1] = 0;
                    break;
                case 2:
                    this.subpos[0]++;
                    this.subpos[1] = 0;
                    break;
                case 3:
                    this.subpos[1]--;
                    this.subpos[0] = 0;
                    break;
                case 4:
                    this.subpos[1]++;
                    this.subpos[0] = 0;
                    break;
                default:
                    // TODO: hlutur ætlar ekki að færa sig þannig að hann slædast nær pos
                    break;
            }
            // Núna er búið að uppfæra subpos þannig að við athugum hvort hlutirinn sé kominn 
            // inn á næsta node
            // M.ö.o, ef hluturinn er kominn 4 eða meira út fyrir subpos[0,0] þá fer hann inn á
            // næsta pos
            // ef hluturinn er á subpos[0,0] þá er hann á miðjunni á reitnum
            // t. d. ef hann er á pos[4,6] og subpos[+4,0] þá á hann að færast á pos[3,6] og subpos[-3,0]
            // t. d. ef hann er á pos[7,12] og subpos[-4,0] þá á hann að færast á pos[6,12] og subpos[+3,0]
            // t. d. ef hann er á pos[9,3] og subpos[0,+4] þá á hann að færast á pos[9,4] og subpos[-3,0]
            // t. d. ef hann er á pos[3,7] og subpos[0,-4] þá á hann að færast á pos[3,6] og subpos[+3,0]
            // og ef hann er á pos[1,2] og subpos[+4,2] þá á hann að færast á pos[2,2] og subpos[-3,0]
            if (System.Math.Abs(subpos[0]) >= 4)
            {
                this.pos[0] += System.Math.Sign(subpos[0]);
                this.subpos[0] = -3 * System.Math.Sign(subpos[0]);
                this.subpos[1] = 0;

            }
            if (System.Math.Abs(subpos[1]) >= 4)
            {
                this.pos[1] += System.Math.Sign(subpos[1]);
                this.subpos[1] = -3 * System.Math.Sign(subpos[1]);
                this.subpos[0] = 0;
            }

        }
    }



}
